import axios from 'axios'
import serverConfig from '../serverConfig';
import { ElMessage } from 'element-plus'
import router from '../router'


// 根据环境设置baseURL
const getBaseURL = () => {
    // 开发环境使用代理，生产环境直接访问
    if (import.meta.env.DEV) {
        return '/' // 开发环境，通过vite代理
    } else {
        return serverConfig.baseURL // 生产环境，直接访问API服务器
    }
}

// 创建axios实例
const service = axios.create({
    baseURL: getBaseURL(),
    timeout: 10000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json;charset=UTF-8',
        // 'token': localStorage.getItem('token') || sessionStorage.getItem('token')
    }
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 在发送请求之前做些什么
        // 可以在这里添加token
        const token = localStorage.getItem('token') || sessionStorage.getItem('token')

        if (token) {
            config.headers.token = `${token}`
        }

        // 生产环境下去掉/api前缀
        if (import.meta.env.PROD && config.url.startsWith('/api')) {
            config.url = config.url.replace(/^\/api/, '')
        }

        return config
    },
    error => {
        // 对请求错误做些什么
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 对响应数据做点什么
        const res = response.data

        // 这里处理后端返回的数据格式 {data: [], msg: '请求成功', code: 200}
        if (res.code === 200 || res.code === '200') {
            // 请求成功，直接返回data部分
            if (res.total) {
                return res
            } else if (res.url) {
                return res.url ? res.url : res
            }
            else {
                return res.data ? res.data : res.rows
            }

        } else if (res.code === 666 || res.code === '666') {
            router.push('/login')
        }
        else {
            // 可以在这里添加全局错误提示
            ElMessage.error(res.msg)
            return Promise.reject(new Error(res.msg || '请求失败'))
        }
    },
    error => {
        // 处理HTTP状态码错误
        let message = '请求失败'
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    message = '未授权，请重新登录'
                    // 可以在这里清除token并跳转到登录页
                    localStorage.removeItem('token')
                    sessionStorage.removeItem('token')
                    // router.push('/login')
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = '请求地址出错'
                    break
                case 408:
                    message = '请求超时'
                    break
                case 500:
                    message = '服务器内部错误'
                    break
                case 501:
                    message = '服务未实现'
                    break
                case 502:
                    message = '网关错误'
                    break
                case 503:
                    message = '服务不可用'
                    break
                case 504:
                    message = '网关超时'
                    break
                case 505:
                    message = 'HTTP版本不受支持'
                    break
                default:
                    message = `连接错误${error.response.status}`
            }
        } else {
            message = '连接到服务器失败'
        }

        // 可以在这里添加全局错误提示
        // Message.error(message)
        return Promise.reject(new Error(message))
    }
)

// 封装请求方法
const request = {
    // GET请求
    get(url, params = {}, data = {}, config = {}) {
        return service({
            method: 'get',
            url,
            params,
            data,
            ...config
        })
    },

    // POST请求
    post(url, data = {}, config = {}) {
        return service({
            method: 'post',
            url,
            data,
            ...config
        })
    },

    // PUT请求
    put(url, data = {}, config = {}) {
        return service({
            method: 'put',
            url,
            data,
            ...config
        })
    },

    // DELETE请求
    delete(url, params = {}, config = {}) {
        return service({
            method: 'delete',
            url,
            params,
            ...config
        })
    },

    // PATCH请求
    patch(url, data = {}, config = {}) {
        return service({
            method: 'patch',
            url,
            data,
            ...config
        })
    },

    // 文件上传
    upload(url, formData, config = {}) {
        return service({
            method: 'post',
            url,
            data: formData,
            headers: {
                'Content-Type': 'multipart/form-data'
            },
            ...config
        })
    },

    // 下载文件
    download(url, params = {}, config = {}) {
        return service({
            method: 'get',
            url,
            params,
            responseType: 'blob',
            ...config
        })
    }
}

// 导出请求实例和原始axios实例
export default request
export { service }